import mimetypes
from openai import OpenAI
import json
import base64
import os
'''
通义万象的api调用方法

'''


class Tongyi():
    def __init__(self,api_key):
        self.api_key = api_key



    
            

    def http_img_client(self,image):
        client = OpenAI(
            api_key=self.api_key,
            base_url="https://dashscope.aliyuncs.com/compatible-mode/v1",
        )
        msg='''
        #判断图片是否为画，如果不是的话你回答：请上传画作进行评价。
        #如果是，请从画的:
        1.技术层面包括（构图、色彩运用、线条与笔触、透视与空间感）,
        2.创意与表达(主题与创意,‌情感表达)‌,
        3.整体效果（视觉冲击力、‌平衡与和谐、技术与艺术的结合）等方面进行评价，
        4.最后对画优点和不足进行点评
        '''
        completion = client.chat.completions.create(
            model="qwen-vl-plus",
            messages=[{"role": "user","content": [
                    {"type": "text","text": msg},
                    {"type": "image_url",
                    "image_url": {"url": image}}
                    ]}]
            )
        # print(completion.model_dump_json())
        return completion.model_dump_json()
    
    def path_client(self,image):
        def encode_image(image_path):
            with open(image_path, "rb") as image_file:
                return base64.b64encode(image_file.read()).decode("utf-8")


        def get_image_format(file_path):
            mime_type, _ = mimetypes.guess_type(file_path)
            if mime_type and mime_type.startswith("image/"):
                print(mime_type.split("/")[1])
                return mime_type.split("/")[1]  # 返回图片格式（如 "jpeg", "png" 等）
            else:
                return None
            
        client = OpenAI(
            api_key=self.api_key,
            base_url="https://dashscope.aliyuncs.com/compatible-mode/v1",
        )
        msg='''
        #判断图片是否为画，如果不是的话你回答：请上传画作进行评价。
        #如果是，请从画的:
        1.技术层面包括（构图、色彩运用、线条与笔触、透视与空间感）,
        2.创意与表达(主题与创意,‌情感表达)‌,
        3.整体效果（视觉冲击力、‌平衡与和谐、技术与艺术的结合）等方面进行评价，
        4.最后对画优点和不足进行点评
        '''
        pic_class = get_image_format(image)
        image_enco = encode_image(image)

        completion = client.chat.completions.create(
            
            model="qwen-vl-plus",

            messages=[{"role": "user","content": [
                    {"type": "text","text": msg},
                    {"type": "image_url",
                    "image_url": {"url": f"data:image/{pic_class};base64,{image_enco}"}}
                    ]}]
            )
        # print(completion.model_dump_json())
        return completion.model_dump_json()
    def is_local_file(self,path):
        """
        判断给定的路径是否为本地文件。
        
        参数:
            path (str): 要检查的路径。
        
        返回:
            bool: 如果是本地文件返回 True，否则返回 False。
        """
        try:
            # 检查路径是否以本地文件系统路径格式开头
            if path.startswith(("/", "\\")) or os.path.isabs(path):
                # 检查路径是否指向一个实际存在的文件
                return os.path.isfile(path)
            else:
                # 如果路径不以本地路径格式开头，可能是相对路径
                # 检查当前目录下是否存在该文件
                return os.path.isfile(os.path.abspath(path))
        except Exception as e:
            # 如果发生异常（例如路径格式错误），返回 False
            print(f"Error checking path: {e}")
            return False

    def execute_if_local_file(self,path):
        """
        根据路径是否为本地文件，执行不同的函数。
        
        参数:
            path (str): 要检查的路径。
            local_function (callable): 如果路径是本地文件，执行的函数。
            non_local_function (callable): 如果路径不是本地文件，执行的函数。
            *args: 传递给函数的额外位置参数。
            **kwargs: 传递给函数的额外关键字参数。
        """
        if self.is_local_file(path):
            return self.path_client(path)
        else:
            return self.http_img_client(path)


        

if __name__ =="__main__":
    api = "这里可以填写你的apikey来调试"
    ty = Tongyi(api)
    img ='F:\\Png-xunlian\\thz9.jpg'
    img_oss = 'https://help-static-aliyun-doc.aliyuncs.com/file-manage-files/zh-CN/20241022/emyrja/dog_and_girl.jpeg'
    filejson = ty.execute_if_local_file(img_oss)
    data = json.loads(filejson)
    content = data.get("choices", [{}])[0].get("message", {}).get("content", "")
    print(content)

